package com.cskaoyan.javase.oop3._1interface._5notice;
/**
 * 方法的形参在方法调用传入实参时，不一定要求数据类型完全一致。
 * 1. **基本类型：**对于基本数据类型的方法形参，存在自动类型提升。
 * 2. **引用类型：** 对于引用数据类型的方法传参，存在自动向上转型。
 *    1. 形参如果写一个普通类：调用方法时需要传入的是该类的对象或者该类的子类对象
 *    2. 形参如果写一个抽象类：调用方法时需要传入的是该抽象类的子类对象
 *    3. 形参如果写一个接口：调用方法时需要传入的是该接口的子类对象
 *
 *
 * 方法的返回值类型，和在方法体中返回具体值（对象）时，不一定要求数据类型完全一致。
 *
 * 1. **基本类型：**方法体中，返回一个具体的值不要求和返回值类型完全一致，存在自动类型提升。
 * 2. **引用类型：** 在方法体中，返回一个对象时不要求就是返回值类型的对象，存在自动向上转型。
 *    1. 返回值类型如果写一个普通类：可以返回该类的对象或者该类的子类对象
 *    2. 返回值类型如果写一个抽象类：返回该抽象类的子类对象。
 *    3. 返回值类型如果写一个接口：返回该接口的子类对象。
 * 
 * @since 17:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Ambiguous method call: both 'Demo.method(AbstractA)' and 'Demo.method(IA)' match
        // method(new A());
        method(new B());
        method(new C());
    }

    public static AbstractA getA(){
        return new A();
    }

    public static IA getA(int a){
        return new A();
    }

    public static void method(AbstractA a){}
    public static void method(IA a){}
}
abstract class AbstractA{}
class A extends AbstractA implements IA{}
interface IA{}
class B extends AbstractA{}
class C implements IA{}
